package com.xbts.system.domain;

import java.math.BigDecimal;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.xbts.system.enums.OrderStatusEnum;
import com.xbts.system.enums.OrderTypeEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import javax.validation.constraints.NotEmpty;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.Data;

import java.util.Objects;
import javax.validation.constraints.NotNull;
import com.xbts.common.annotation.Excel;
import com.xbts.common.utils.StringUtils;
import com.xbts.common.core.domain.BaseEntity;

/**
 * 订单对象 cn_order
 *
 * @author xbts
 * @date 2023-08-03
 */
@Data
@ApiModel("订单对象")
@TableName("cn_order")
public class CnOrder extends BaseEntity {

private static final long serialVersionUID=1L;

    /** 订单id */
    @TableId
    @JsonSerialize(using= ToStringSerializer.class)
    private Long orderId;
    /** 用户id */
    @Excel(name = "用户id")
    @ApiModelProperty("用户id")
    @NotEmpty(message = "用户id不能为空")
    private Long userId;
    /** 用户账号 */
    @Excel(name = "用户账号")
    @ApiModelProperty("用户账号")
    @NotEmpty(message = "用户账号不能为空")
    private String userName;

    /**
     * @See com.xbts.system.enums.OrderStatusEnum
     */
    /** 订单状态（已购买，审核中，审核拒绝） */
    @Excel(name = "订单状态", readConverterExp = "已购买，审核中，审核拒绝")
    @ApiModelProperty("订单状态")
    @NotEmpty(message = "订单状态不能为空")
    private OrderStatusEnum orderStatus;
    /** 付款状态 */
    @Excel(name = "付款状态")
    @ApiModelProperty("付款状态")
    @NotEmpty(message = "付款状态不能为空")
    private String payStatus;
    /** 支付方式 */
    @Excel(name = "支付方式")
    @ApiModelProperty("支付方式")
    @NotEmpty(message = "支付方式不能为空")
    private String paymentMethod;
    /** 支付时间 */
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @Excel(name = "支付时间", width = 40, dateFormat = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty("支付时间")
    @NotNull(message = "支付时间不能为空")
    private Date paymentTime;
    /** 订单编号 */
    @Excel(name = "订单编号")
    @ApiModelProperty("订单编号")
    @NotEmpty(message = "订单编号不能为空")
    private String sn;
    /** 修改价格 */
    @Excel(name = "修改价格")
    @ApiModelProperty("修改价格")
    @NotEmpty(message = "修改价格不能为空")
    private BigDecimal updatePrice;
    /** 原始价格 */
    @Excel(name = "原始价格")
    @ApiModelProperty("原始价格")
    @NotEmpty(message = "原始价格不能为空")
    private BigDecimal originalPrice;

    /** 优惠的金额 */
    @Excel(name = "优惠的金额")
    @ApiModelProperty("优惠的金额")
    @NotEmpty(message = "优惠的金额不能为空")
    private BigDecimal discountPrice;

    /** 订单摘要 */
    @ApiModelProperty("订单摘要")
    @NotEmpty(message = "订单摘要不能为空")
    private String orderAbstract;

    /**
     * 支付凭证地址
     */
    private String paymentVoucherAddress;

    private String remark;

    /**
     * 购物车类型（USER用户 SYSTEM系统内）
     * @see OrderTypeEnum
     */
    private String shoppingCarType;

    public<T> QueryWrapper<T> queryWrapper(){
        QueryWrapper<T> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq(!Objects.isNull(userId),"user_id",userId);
        queryWrapper.like(StringUtils.isNotEmpty(userName),"user_name",userName);
        queryWrapper.like(StringUtils.isNotEmpty(payStatus),"pay_status",payStatus);
        queryWrapper.like(StringUtils.isNotEmpty(paymentMethod),"payment_method",paymentMethod);
        queryWrapper.eq(!Objects.isNull(paymentTime),"payment_time",paymentTime);
        queryWrapper.like(StringUtils.isNotEmpty(sn),"sn",sn);
        if (StringUtils.isNotNull(this.getParams())) {
            if (StringUtils.isNotEmpty(this.getParams().getOrDefault("startTime", "") + "")) {
                queryWrapper.ge("create_time", this.getParams().get("startTime"));
            }
            if (StringUtils.isNotEmpty(this.getParams().getOrDefault("endTime", "") + "")) {
                queryWrapper.le("create_time", this.getParams().get("endTime"));
            }
        }
        return queryWrapper;
    }
}
